#include<iostream>
#include<string>
#include<sstream>
#include<fstream>
using namespace std;

class BCJ{
	public:
		int parent[1000];
		int rnk[1000];
		int count;//记录类数
		BCJ(int n){ //初始化
			count=n;
			for(int i=1;i<=n;i++){
				parent[i]=i;
				rnk[i]=0;
			}
		}
		int find(int a){ //找到a的所在类的标志
			if(parent[a]!=a){
				parent[a]=find(parent[a]);
			}
			return parent[a];
		}
		void uni(int a,int b){
			int pa=find(a);
			int pb=find(b);
			if(pa==pb){ //已经同一类
				return;
			}
			if(rnk[pa]==rnk[pb]){ //高度同，任取一个为另一个的孩子
				parent[pa]=pb;
				rnk[pb]++;
			}
			else if(rnk[pa]<rnk[pb]){
				parent[pa]=pb;
			}
			else{
				parent[pb]=pa;
			}
			count--;
			return;
		}
};
int main(){
	ifstream infile("in.txt");
	string line;
	getline(infile,line);
	stringstream ss(line);
	int ncity=0;
	int mroad=0;
	ss>>ncity;ss>>mroad;
	BCJ bcj(ncity);
	for(int j=1;j<=mroad;j++){
		getline(infile,line);
		stringstream ss1(line);
		int city1=0;int city2=0;
		ss1>>city1;ss1>>city2;
		bcj.uni(city1,city2);
	}
	infile.close();
	cout<<bcj.count-1;
	system("pause");
	return 0;
}